package com.aspose.words.examples.programming_documents.tables.ColumnsAndRows;

import com.aspose.words.*;
import com.aspose.words.examples.Utils;

public class JoinAndSplitTables {

    private static final String dataDir = Utils.getSharedDataDir(JoinAndSplitTables.class) + "Tables/";

    public static void main(String[] args) throws Exception {
        //ExStart:JoinAndSplitTables
        // Combine the rows from two tables into one
        combineTwoTablesIntoOne();

        // Split a Table into Two Separate Tables
        splitATableIntoTwoSeparateTables();
        //ExStart:JoinAndSplitTables
    }

    //ExStart:combineTwoTablesIntoOne
    public static void combineTwoTablesIntoOne() throws Exception {
        // Load the document.
        Document doc = new Document(dataDir + "Table.Document.doc");

        // Get the first and second table in the document.
        // The rows from the second table will be appended to the end of the first table.
        Table firstTable = (Table) doc.getChild(NodeType.TABLE, 0, true);
        Table secondTable = (Table) doc.getChild(NodeType.TABLE, 1, true);

        // Append all rows from the current table to the next.
        // Due to the design of tables even tables with different cell count and widths can be joined into one table.
        while (secondTable.hasChildNodes())
            firstTable.getRows().add(secondTable.getFirstRow());

        // Remove the empty table container.
        secondTable.remove();

        doc.save(dataDir + "Table.CombineTables Out.doc");
        //ExEnd:combineTwoTablesIntoOne
    }

    //ExStart:splitATableIntoTwoSeparateTables
    public static void splitATableIntoTwoSeparateTables() throws Exception {
        // Load the document.
        Document doc = new Document(dataDir + "Table.SimpleTable.doc");

        // Get the first table in the document.
        Table firstTable = (Table) doc.getChild(NodeType.TABLE, 0, true);

        // We will split the table at the third row (inclusive).
        Row row = firstTable.getRows().get(2);

        // Create a new container for the split table.
        Table table = (Table) firstTable.deepClone(false);

        // Insert the container after the original.
        firstTable.getParentNode().insertAfter(table, firstTable);

        // Add a buffer paragraph to ensure the tables stay apart.
        firstTable.getParentNode().insertAfter(new Paragraph(doc), firstTable);

        Row currentRow;

        do {
            currentRow = firstTable.getLastRow();
            table.prependChild(currentRow);
        } while (currentRow != row);

        doc.save(dataDir + "Table.SplitTable Out.doc");
        //ExEnd:splitATableIntoTwoSeparateTables
    }
}
